package fr.bugtracker.entity.technique;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.security.core.GrantedAuthority;

import fr.bugtracker.commun.enumeration.EnumRole;
import fr.bugtracker.dao.technique.IdentifiableEntity;

/**
 * Classe entité role
 */
@Entity
@Table(name = "role")
public class Role implements GrantedAuthority, IdentifiableEntity {

	/**
	 *
	 */
	private static final long serialVersionUID = -8891539610610915615L;
	/**
	 * code
	 */
	@Id
	@Column(name = "code", unique = true, length = 50)
	private String code;
	/**
	 * libellé
	 */
	@NotEmpty
	@Column(name = "libelle", length = 100, nullable = false)
	private String libelle;

	/**
	 * Constructeur de la classe <code>Role</code>.
	 */
	public Role() {
	}

	/**
	 * Constructeur de la classe <code>Role</code>.
	 * @param pEnumRole {@link EnumRole}
	 */
	public Role(EnumRole pEnumRole) {
		code = pEnumRole.name();
	}

	/**
	 * @see fr.bugtracker.dao.technique.IdentifiableEntity#getId()
	 */
	@Override
	public Object getId() {
		return code;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut code.</b></p>
	 * @return Retourne l'attribut code sous forme de <code>String</code>.
	 */
	public String getCode() {
		return code;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut code.</b></p>
	 * @param pCode L'attribut code à modifier.
	 */
	public void setCode(String pCode) {
		code = pCode;
	}

	/**
	 * <p><b>Accès en lecture à l'attribut libelle.</b></p>
	 * @return Retourne l'attribut libelle sous forme de <code>String</code>.
	 */
	public String getLibelle() {
		return libelle;
	}

	/**
	 * <p><b>Accès en écriture à l'attribut libelle.</b></p>
	 * @param pLibelle L'attribut libelle à modifier.
	 */
	public void setLibelle(String pLibelle) {
		libelle = pLibelle;
	}

	/**
	 * @see org.springframework.security.core.GrantedAuthority#getAuthority()
	 */
	@Override
	public String getAuthority() {
		return getCode();
	}

	/**
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (!(obj instanceof Role)) {
			return false;
		}
		Role other = (Role) obj;
		return new EqualsBuilder().append(code, other.code).isEquals();
	}

	/**
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		return new HashCodeBuilder(17, 37).append(code).toHashCode();
	}

	/**
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("Role [code=").append(this.code).append(", libelle=").append(this.libelle).append("]");
		return builder.toString();
	}

}